package com.bbseguros.pesquisador.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.bbseguros.pesquisador.bean.MensagemBean;
import com.bbseguros.pesquisador.util.ConnectDB;


/**
 * @author rrodrigues
 * 
 */
public class MensagensDAO {

	private static Logger logger = Logger.getLogger(MensagensDAO.class);

	private Connection conn = null;
	private static MensagensDAO instance = null;

	private MensagensDAO() {
		try {
			conn = ConnectDB.getConnection();
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		}		
	}
	
	public static MensagensDAO getInstance(){
		if(instance == null){
			instance = new MensagensDAO();
		}
		return instance;
	}
	

	/**
	 * @param userName
	 * @param password
	 * @return
	 */
	public List<MensagemBean> selectAll(){
		MensagemBean mensagem = null;
		List<MensagemBean> mensagens = new ArrayList<MensagemBean>();
		
		PreparedStatement stmt = null;
		try {
			
			if (conn == null) {
				conn = ConnectDB.getConnection();
			}
			
			StringBuffer buffer = new StringBuffer();	
			buffer.append("SELECT u.usuario, m.id_msg, m.id_usuario, m.data, m.status, m.mensagem");
			buffer.append(" FROM tbl_usuario u, tbl_mensagens m");
			buffer.append(" WHERE ");
			buffer.append("u.id_usuario = m.id_usuario and status='0';");
			
			stmt = conn.prepareStatement(buffer.toString());
			
			ResultSet rs = stmt.executeQuery();
			while (rs.next()) {
				mensagem = new MensagemBean();
				mensagem.setUsuario(rs.getString(1));
				mensagem.setId(rs.getInt(2));
				mensagem.setIdUsuario(rs.getInt(3));
				mensagem.setData(rs.getString(4));
				mensagem.setStatus(rs.getString(5));
				mensagem.setTexto(rs.getString(6));
				
				mensagens.add(mensagem);
			}
		
		} catch (SQLException e) {
			conn = null;
			logger.error(e.getMessage(), e);
			
		}catch (Exception e) {
			conn = null;
			logger.error(e.getMessage(), e);
			
		} finally {
			ConnectDB.cleanUp(stmt);
		}
		return mensagens;
	}

	public List<MensagemBean> selectMensagemByUser(int idUsuario){
		MensagemBean mensagem = null;
		List<MensagemBean> mensagens = new ArrayList<MensagemBean>();

		PreparedStatement stmt = null;
		try {
			
			if (conn == null) {
				conn = ConnectDB.getConnection();
			}
			
			StringBuffer buffer = new StringBuffer();			
			buffer.append("SELECT * FROM tbl_mensagens WHERE status='0' AND id_usuario = ?;");
			
			stmt = conn.prepareStatement(buffer.toString());
			stmt.setInt(1, idUsuario);
			
			ResultSet rs = stmt.executeQuery();
			while (rs.next()) {
				mensagem = new MensagemBean();
				mensagem.setId(rs.getInt("id_msg"));
				mensagem.setIdUsuario(rs.getInt("id_usuario"));
				mensagem.setData(rs.getString("data"));
				mensagem.setStatus(rs.getString("status"));
				mensagem.setTexto(rs.getString("mensagem"));
				
				mensagens.add(mensagem);
			}
		
		} catch (SQLException e) {
			conn = null;
			logger.error(e.getMessage(), e);
			
		}catch (Exception e) {
			conn = null;
			logger.error(e.getMessage(), e);
			
		} finally {
			ConnectDB.cleanUp(stmt);
		}
		return mensagens;
	}

	public MensagemBean selectMensagemById(int idMsg){
		MensagemBean mensagem = null;

		PreparedStatement stmt = null;
		try {
			
			if (conn == null) {
				conn = ConnectDB.getConnection();
			}
			
			StringBuffer buffer = new StringBuffer();			
			buffer.append("SELECT u.usuario, m.id_msg, m.id_usuario, m.data, m.status, m.mensagem");
			buffer.append(" FROM tbl_usuario u, tbl_mensagens m");
			buffer.append(" WHERE ");
			buffer.append("u.id_usuario = m.id_usuario and id_msg = ?;");
			
			stmt = conn.prepareStatement(buffer.toString());
			stmt.setInt(1, idMsg);
			
			ResultSet rs = stmt.executeQuery();
			while (rs.next()) {
				mensagem = new MensagemBean();
				mensagem.setUsuario(rs.getString(1));
				mensagem.setId(rs.getInt(2));
				mensagem.setIdUsuario(rs.getInt(3));
				mensagem.setData(rs.getString(4));
				mensagem.setStatus(rs.getString(5));
				mensagem.setTexto(rs.getString(6));
			}
		
		} catch (SQLException e) {
			conn = null;
			logger.error(e.getMessage(), e);
			
		}catch (Exception e) {
			conn = null;
			logger.error(e.getMessage(), e);
			
		} finally {
			ConnectDB.cleanUp(stmt);
		}
		return mensagem;
	}	
	
	/**
	 * @param bean
	 * @return
	 */
	public boolean insertMensagem(MensagemBean bean) {
		boolean toReturn = false;
		PreparedStatement stmt = null;
		try {
			
			if (conn == null) {
				conn = ConnectDB.getConnection();
			}
			int idPesq = getMensagensId();
			
			StringBuffer buffer = new StringBuffer();			
			buffer.append("INSERT INTO tbl_mensagens (id_msg, id_usuario, data, status, mensagem)");
			buffer.append("VALUES (?,?,(SELECT NOW()),?,?)");
			
			stmt = conn.prepareStatement(buffer.toString());
			stmt.setInt(1, idPesq);
			stmt.setInt(2, bean.getIdUsuario());
			stmt.setString(3, "0");
			stmt.setString(4, bean.getTexto());

			int ret = stmt.executeUpdate();	
			if(ret>0) {
				toReturn = true;
			}
			logger.debug("toReturn: "+toReturn);
		} catch (SQLException e) {
			conn = null;
			logger.error(e.getMessage(), e);
			
		}catch (Exception e) {
			conn = null;
			logger.error(e.getMessage(), e);
			
		} finally {
			ConnectDB.cleanUp(stmt);
		}
		return toReturn;
	}

	/**
	 * @param bean
	 * @return
	 */
	public boolean updateMensagemById(MensagemBean bean) {
		boolean toReturn = false;
		PreparedStatement stmt = null;
		try {
			
			if (conn == null) {
				conn = ConnectDB.getConnection();
			}
			
			StringBuffer buffer = new StringBuffer();			
			buffer.append("UPDATE tbl_mensagens SET status = 1 ");
			buffer.append("WHERE id_msg = ?");
			
			stmt = conn.prepareStatement(buffer.toString());
			stmt.setInt(1, bean.getId());

			int ret = stmt.executeUpdate();	
			if(ret>0) {
				toReturn = true;
			}
			logger.debug("toReturn: "+toReturn);
		} catch (SQLException e) {
			conn = null;
			logger.error(e.getMessage(), e);
			
		}catch (Exception e) {
			conn = null;
			logger.error(e.getMessage(), e);
			
		} finally {
			ConnectDB.cleanUp(stmt);
		}
		return toReturn;
	}	
	
	public boolean deletedMensagemById(MensagemBean mensagem){
		boolean toReturn = false;
		
		PreparedStatement stmt = null;
		try {
			
			if (conn == null) {
				conn = ConnectDB.getConnection();
			}
			
			StringBuffer buffer = new StringBuffer();			
			buffer.append("DELETE FROM tbl_mensagens WHERE id_msg = ?;");
			
			stmt = conn.prepareStatement(buffer.toString());
			stmt.setInt(1, mensagem.getId());
			
			int ret = stmt.executeUpdate();	
			if(ret>0) {
				toReturn = true;
			}
			logger.debug("toReturn: "+toReturn);
		
		} catch (SQLException e) {
			conn = null;
			logger.error(e.getMessage(), e);
			
		}catch (Exception e) {
			conn = null;
			logger.error(e.getMessage(), e);
			
		} finally {
			ConnectDB.cleanUp(stmt);
		}
		return toReturn;
	}	
	
	public int getMensagensId(){
		if (conn == null) {
			return 0;
		}
		Statement stmt = null;
		int returnId = 0;

		try {
			returnId = ConnectDB.getSequenceMySql(conn, "seq_mensagens");

		} catch (Exception e) {
			conn = null;
			logger.error(e.getMessage(), e);
		}  finally {
			ConnectDB.cleanUp(stmt);
		}
		return returnId;
	}
}
